#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
简单的FE算法进化过程可视化工具
绘制种群平均得分和最优得分随迭代次数的变化
"""

import json
import matplotlib.pyplot as plt
import os

# 设置中文字体和绘图参数
#plt.rcParams['font.family'] = ['Times New Roman', 'SimSun']  # 英文Times New Roman，中文宋体
plt.rcParams['font.family']='Times New Roman , SimSun' # 添加中文字体为宋体
plt.rcParams['font.size'] = 16  # 字体大小
plt.rcParams['axes.unicode_minus'] = False  # 正确显示负号
plt.rcParams['xtick.direction'] = 'in'  # x轴刻度线朝内
plt.rcParams['ytick.direction'] = 'in'  # y轴刻度线朝内

def load_iterative_data(file_path):
    """
    加载迭代过程数据
    
    参数:
        file_path: iterative_process.json文件路径
    
    返回:
        data: 迭代数据列表
    """
    try:
        with open(file_path, 'r', encoding='utf-8') as f:
            data = json.load(f)
        print(f"成功加载数据: {file_path}")
        return data
    except FileNotFoundError:
        print(f"文件未找到: {file_path}")
        return None
    except json.JSONDecodeError:
        print(f"JSON格式错误: {file_path}")
        return None

def plot_evolution_progress(data, save_path=None, show_plot=True):
    """
    绘制进化过程图表
    
    参数:
        data: 迭代数据
        save_path: 图片保存路径（可选）
        show_plot: 是否显示图片
    """
    if not data:
        print("没有数据可以绘制")
        return
    
    # 提取数据
    iterations = [item['iteration'] for item in data]
    avg_scores = [item['average_score'] for item in data]
    max_scores = [item['max_score'] for item in data]
    min_scores = [item['min_score'] for item in data]
    
    # 创建图表
    plt.figure(figsize=(10, 6))
    
    # 绘制透明区域表示种群整体情况（可注释掉下面两行）
    plt.fill_between(iterations, min_scores, max_scores, alpha=0.5, color='lightblue', label='种群得分范围')
    # plt.fill_between(iterations, min_scores, max_scores, alpha=0.2, color='lightblue', label='种群得分范围')
    
    # 绘制曲线
    plt.plot(iterations, avg_scores, 'b-o', linewidth=2, markersize=5, label='种群平均得分')
    plt.plot(iterations, max_scores, 'r-s', linewidth=2, markersize=5, label='种群最优得分')
    
    # 设置图表属性
    plt.xlabel('迭代次数', fontsize=16)
    plt.ylabel('得分', fontsize=16)
    plt.legend(fontsize=16)
    #plt.grid(True, alpha=0.3)
    
    # 设置y轴刻度为整数
    from matplotlib.ticker import MaxNLocator
    plt.gca().xaxis.set_major_locator(MaxNLocator(integer=True))
    
    # 美化图表
    plt.tight_layout()
    
    # 保存图片
    if save_path:
        plt.savefig(save_path, dpi=600, bbox_inches='tight')
        print(f"图片已保存至: {save_path}")
    
    # 显示图片
    if show_plot:
        plt.show()
    else:
        plt.close()

def print_progress_stats(data):
    """
    打印进化过程统计信息
    
    参数:
        data: 迭代数据
    """
    if not data:
        print("没有数据可以分析")
        return
    
    print("\n" + "="*50)
    print("FE算法进化过程统计")
    print("="*50)
    
    initial_avg = data[0]['average_score']
    final_avg = data[-1]['average_score']
    initial_max = data[0]['max_score']
    final_max = data[-1]['max_score']
    
    print(f"总迭代次数: {len(data) - 1}")
    print(f"种群大小: {data[0]['population_size']}")
    print(f"初始平均得分: {initial_avg:.4f}")
    print(f"最终平均得分: {final_avg:.4f}")
    print(f"平均得分提升: {final_avg - initial_avg:.4f}")
    print(f"初始最优得分: {initial_max:.4f}")
    print(f"最终最优得分: {final_max:.4f}")
    print(f"最优得分提升: {final_max - initial_max:.4f}")
    
    if initial_avg > 0:
        avg_improvement = ((final_avg - initial_avg) / initial_avg) * 100
        print(f"平均得分提升率: {avg_improvement:+.2f}%")
    
    if initial_max > 0:
        max_improvement = ((final_max - initial_max) / initial_max) * 100
        print(f"最优得分提升率: {max_improvement:+.2f}%")



def main():
    """主函数"""
    json_file = "iterative_process.json"
    
    # 加载数据
    data = load_iterative_data(json_file)
    
    if data:
        # 打印统计信息
        print_progress_stats(data)
        
        # 绘制图表
        plot_evolution_progress(
            data, 
            save_path="evolution_progress.png",  # 保存图片
            show_plot=True  # 显示图片
        )
    else:
        print("无法加载数据，请检查文件路径")

if __name__ == "__main__":
    main()